﻿using BLevy.Datos.Repositories;
using BLevy.Entidad;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace BLevy.Negocio
{
    public class Cupones
    {
        //public static int GenerarCupones()
        //{
        //    ICuponRepository _repository = new CuponRepository();
        //    return _repository.GenerarCupones();
        //}

        public static int VerificarImpresionMensual(DateTime primerdiames, DateTime ultimodiames)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.VerificarImpresionMensual(primerdiames, ultimodiames);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> FindAllPorFecha(DateTime fecha)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllPorFecha(fecha);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> FindAll()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAll();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<CuponDetalle> FindAllDetalles()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllDetalles();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<CuponPrefijo> FindAllPrefijos()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllPrefijos();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int AgregarPrefijo(CuponPrefijo prefijo)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.AgregarPrefijo(prefijo);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int EliminarPrefijo(int id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.EliminarPrefijo(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Cupon FindById(int id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindById(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Cupon FindByNumero(string nro)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindByNumero(nro);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<CuponDetalle> FindAllDetallesByIdCupon(int cupon_id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllDetallesByIdCupon(cupon_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static double CalcularImporteCupon(Cupon cupon)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.CalcularImporteCupon(cupon);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> GetAllCuponesAImprimir()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.GetAllCuponesAImprimir();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> FindAllConSocio()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllConSocio();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int GenerarCupon()
        {
            int cupon_id = 0;
            double total = 0;
            bool resultado = true;

            ISocioRepository _repositorySocio = new SocioRepository();
            ICuponRepository _repositoryCupon = new CuponRepository();
            IPeriodoSocioRepository _repositoryPeriodoSocio = new PeriodoSocioRepository();
            IPeriodoRepository _repositoryPeriodo = new PeriodoRepository();

            try
            {
                //using (TransactionScope scope = new TransactionScope())
                //{
                    IList<Socio> sociosL = _repositorySocio.FindAllActivosConLocalidadZonaPlan();
                    foreach (Socio socio in sociosL)
                    {
                        //Obtengo el prefijo activo
                        CuponPrefijo prefijo = _repositoryCupon.GetPrefijoActivo();

                        //obtengo el proximo numero de cupon
                        int proximo_numero = _repositoryCupon.GetNextNumero(prefijo.id);

                        if (proximo_numero == 1)
                        {
                            int inserto = _repositoryCupon.AddNumeroCupon(prefijo, String.Format("{0:00000000}", proximo_numero));
                            if (inserto == 0)
                            {
                                resultado = false;
                                cupon_id = 0;
                                break;
                            }
                        }
                        else
                        {
                            int actualizo = _repositoryCupon.ModifyNumeroCupon(prefijo, String.Format("{0:00000000}", proximo_numero));
                            if (actualizo == 0)
                            {
                                resultado = false;
                                cupon_id = 0;
                                break;
                            }
                        }

                        //obtenengo los periodos impagos del socio
                        IList<PeriodoSocio> periodo_socio = _repositoryPeriodoSocio.FindAllImpagosBySocioId(socio.id);

                        //calculo el total del cupon
                        total = 0;
                        foreach (PeriodoSocio _periodo in periodo_socio)
                        {
                            Periodo periodo = _repositoryPeriodo.FindById(_periodo.periodo_id);
                            if (socio.plan.recargo == 0)
                            {
                                total += _periodo.importe;
                            }
                            else
                            {
                                if (periodo.vencimiento_1 < DateTime.Now && _periodo.estado == "I")
                                {
                                    total = total + (_periodo.importe + periodo.recargo);
                                }
                                else
                                {
                                    total = total + _periodo.importe;
                                }
                            }

                        }

                        //inserto el cupon
                        string cupon_nro = prefijo.prefijo + "-" + String.Format("{0:00000000}", proximo_numero);
                        cupon_id = _repositoryCupon.GenerarCupon(socio.id, (cupon_nro), total);
                        if (cupon_id > 0)
                        {
                            foreach (PeriodoSocio _periodo in periodo_socio)
                            {
                                int detalle = _repositoryCupon.AddDetalleCupon(cupon_id, _periodo.id, _periodo.importe);
                                if (detalle == 0)
                                {
                                    resultado = false;
                                    cupon_id = 0;
                                    break;
                                }
                            }

                            if (resultado == false)
                            {
                                cupon_id = 0;
                                break;
                            }
                        }

                    }//foreach socios

                    if (resultado == true)
                    {
                        //scope.Complete();
                    }
                //}
            }
            catch (Exception e)
            {
                throw e;
            }
            return cupon_id;
        }

        public static int EntradaSalidaCupones(CobradorCupon _cobradorCupon)
        {
            try
            {
                ICobradorCuponRepository _repository = new CobradorCuponRepository();
                return _repository.EntradaSalidaCupones(_cobradorCupon);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> FindAllCondicional(string numero_cupon, string numero_certificado, DateTime? desde, DateTime? hasta, int? formapago_id, int? zona_id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllCondicional(numero_cupon, numero_certificado, desde, hasta, formapago_id, zona_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Cupon> FindAllImpresionParcial(string nrocert_desde, string nrocert_hasta, int? localidad_id, int? zona_id, string letra_desde, string letra_hasta, string nrocupon_desde, string nrocupon_hasta)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllImpresionParcial(nrocert_desde, nrocert_hasta, localidad_id, zona_id, letra_desde, letra_hasta, nrocupon_desde, nrocupon_hasta);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int PagoCupon(Cupon _cupon)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.PagoCupon(_cupon);
            }
            catch (Exception e)
            {
                throw e;
            }
        }



        public static IList<Cupon> FindAllCondicionalReporte(string numero_cupon, string numero_certificado, DateTime? desde, DateTime? hasta)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllCondicionalReporte(numero_cupon, numero_certificado, desde, hasta);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static IList<CuponDetalle> FindAllDetallesPagoByIdCupon(int cupon_id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllDetallesPagoByIdCupon(cupon_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static int SetNumeracionCupon(int prefijo_id, int proximo_nro, int numero)
        {
            bool res = true;
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {

                    ICuponRepository _repository = new CuponRepository();

                    if (proximo_nro == 1)
                    {
                        int resultado_insert = _repository.SetNumeracionCupon(prefijo_id, String.Format("{0:00000000}", numero));
                        if (resultado_insert == 0)
                        {
                            res = false;
                            return 0;
                        }
                        else
                        {
                            scope.Complete();
                            return resultado_insert;

                        }
                    }
                    else
                    {                      
                        int resultado_modificar = _repository.ModificarNumeracionCupon(prefijo_id, String.Format("{0:00000000}", numero));
                        if (resultado_modificar == 0)
                        {
                            res = false;
                            return 0;
                        }
                        else
                        {
                            scope.Complete();
                            return resultado_modificar;
                        }

                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static CuponPrefijo GetPrefijoActivo()
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.GetPrefijoActivo();
            }
            catch(Exception e)
            {
                throw e;
            }

        }

        public static int GetNextNumero(int prefijo_id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.GetNextNumero(prefijo_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static IList<Cupon> FindAllPorSocioId(int socio_id)
        {
            try
            {
                ICuponRepository _repository = new CuponRepository();
                return _repository.FindAllPorSocioId(socio_id).OrderByDescending(x => x.fecha_emision).ToList();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

    }
}
